/**
 * @file    main.c 
 * @author  18408107475@163.com
 * @version V1.0.0
 * @date    2025-07-12
 * @brief   基于PWMI模式的PWM信号频率与占空比测量系统
 * @details 
 * 硬件配置：
 *   - 主控芯片：STM32F10x系列（如STM32F103C8T6）
 *   - 显示设备：OLED SSD1315（128x64分辨率，I2C接口，默认地址0x78）
 *   - PWM输出：PA1（TIM2_CH2），用于生成测试信号
 *   - PWMI输入：PA6（TIM3_CH1），用于测量PWM信号的频率和占空比
 *   - 硬件连接：需用导线连接PA1（PWM输出）与PA6（PWMI输入），形成闭环测试回路
 * 
 * 软件特性：
 *   - 生成可配置频率和占空比的PWM信号（默认200Hz，90%占空比）
 *   - 通过PWMI模式同步测量PWM信号的频率和占空比
 *   - 在OLED实时显示测量结果，刷新率由主循环决定（无延时则最高刷新率）
 */

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"              // STM32标准外设库（提供所有外设寄存器定义）
#include "Delay.h"                  // 基于SysTick的精确延时函数（用于可选延时控制）
#include "USART1_Config.h"          // USART1初始化及printf重定向（备用调试接口，未使用）
#include "OLED_SSD1315_Config.h"    // OLED SSD1315驱动库（提供显示字符串/数字函数）
#include "PWM.H"                    // PWM输出模块（控制PA1生成PWM信号）
#include "PWMI_Config.h"            // PWMI输入模块（通过PA6测量频率和占空比）

/* 私有变量定义 --------------------------------------------------------------*/
// 无额外私有变量，直接通过函数接口实时获取测量数据


/**
 * @brief  主程序入口
 * @param  None
 * @retval int 程序状态码（实际不会返回，因主循环为无限循环）
 * @执行流程：
 *   1. 初始化外设：OLED显示屏、PWM模块、PWMI模块
 *   2. 配置PWM输出参数：频率200Hz，占空比90%
 *   3. 初始化OLED显示界面：清屏并显示固定文本框架
 *   4. 进入无限循环：实时读取频率和占空比，更新OLED显示
 */
int main(void)
{
    // 初始化OLED显示屏（I2C通信初始化，设置显示模式）
    OLED_SSD1315_Init();       
    
    // 初始化PWM模块：配置TIM2_CH2（PA1）为PWM输出模式，默认频率20kHz
    PWM_Config();               
    
    // 初始化PWMI模块：配置TIM3为PWMI模式，通过PA6测量PWM的频率和占空比
    PWMI_Config();              

    // 调整PWM输出频率：
    // 计算公式：PWM频率 = 72MHz / [(预分频器值+1) × (ARR+1)]
    // 此处预分频器=3600-1=3599，ARR=99（默认值）
    // 计算过程：72MHz / (3600 × 100) = 72000000 / 360000 = 200Hz
    PWM_SetPrescaler(3600-1);  
    
    // 设置PWM占空比：Compare=90（范围0~99）
    // 占空比=90/99≈90.9%（因占空比计算公式为(Compare/99)×100%）
    PWM_SetCompare2(90);       

    // 清屏操作：清除OLED显存，初始化显示界面
    OLED_SSD1315_Clear();       
    
    // 在OLED第0行显示固定文本"Freq:000000HZ"（频率显示框架）
    OLED_SSD1315_ShowString(0,0, "Freq:000000HZ", 16, false); 
    
    // 在OLED第2行（行索引2）显示固定文本"Duty:000000%"（占空比显示框架）
    OLED_SSD1315_ShowString(0,2, "Duty:000000%", 16, false); 

    // 无限循环：持续测量并更新显示
    while (1)                   
    {
        // 读取PWMI测量的频率值，显示在OLED第0行、第41列（覆盖"000000"）
        // 显示格式：6位数字，字体大小16x16
        OLED_SSD1315_ShowNum(41,0, PWMI_GetFreq(), 6, 16);
        
        // 读取PWMI测量的占空比，显示在OLED第2行、第41列（覆盖"000000"）
        // 显示格式：6位数字（实际有效范围0~100，前4位补0）
        OLED_SSD1315_ShowNum(41,2, PWMI_GetDuty(), 6, 16);
    }
}

/************************ (C) COPYRIGHT 2025 TS *****END OF FILE****/